perm filename SLICE.OLD[GEO,BGB] blob
sn#085230 filedate 1974-02-01 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00003 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE SLICE
C00005 00003 SUBR(SLICE,EDGE,ZCUT)
C00009 ENDMK
C⊗;
TITLE SLICE
EXTERN ESPLIT,INVERT,OTHER,VCCW,MKFE,ECCW
SUBR(VMARK,BODY,ZCUT)
ACCUMULATORS{V,PDEL,NDEL,E,E0}
;CLEAR THE NZZ AND PZZ BITS OF ALL THE EDGES AND VERTICES.
SLACI(PZZ+NZZ)↔LAC 1,BODY
ANDCAM(1)↔PVT 1,1↔CAME 1,BODY↔GO .-3
ANDCAM(1)↔PED 1,1↔CAME 1,BODY↔GO .-3
;POSITIVE AND NEGATIVE EPSILON.
LAC PDEL,ZCUT↔FADR PDEL,[0.01]
LAC NDEL,ZCUT↔FSBR NDEL,[0.01]
;FORCE THE VERTICES TO BE ABOVE OR BELOW THE SLICE PLANE.
LAC V,BODY
L1: PVT V,V↔CAMN V,BODY↔POP2J
L2: LAC ZWC(V)
CAML PDEL↔GO[MARK V,PZZ↔GO L3]
CAMG NDEL↔GO[MARK V,NZZ↔GO L3]
FSBR ZCUT
SKIPL ↔DAC PDEL,ZWC(V)
SKIPGE↔DAC NDEL,ZWC(V)↔GO L2
;MARK THE EDGES OF THIS VERTEX AS PZZ OR NZZ.
L3: PED E,V↔LAC E0,E
L4: PVT 1,E↔CAME 1,V↔GO .+3↔PCW 1,E↔GO L5 ;AC1 ← ECCW(E,V).
NVT 1,E↔CAME 1,V↔GO L1 ↔NCW 1,E
L5: IORM 0,(E)↔LAC E,1 ;AC0 CONTAINS THE BIT.
CAME E,E0↔GO L4↔GO L1
ENDR VMARK;1/11/74(BGB)----------------------------------------------
SUBR(SLICE,EDGE,ZCUT)
ACCUMULATORS{V1,V2,DX,DY,DZ}
;TEST FOR EDGE CROSSING THE SLICE PLANE.
LAC 1,EDGE
TEST 1,PZZ↔POP2J
TEST 1,NZZ↔POP2J
;INITIALIZATION.
SETOM FLAG ;FIRST TIME THRU -1 FLAG.
DAC 1,E↔NVT 2,1↔TEST 2,PZZ
GO[CALL(INVERT,E)↔GO .+1] ;FORCE NVT(E) INTO PZZ HALF-SPACE.
LAC 1,E↔NFACE 1,1
DAC 1,F0↔DAC 1,F ;FIRST FACE.
;SPLIT EDGE - SO THAT PVT(E) IS IN NZZ HALF SPACE.
L1: LAC 1,E↔MARKZ 1,PZZ+NZZ
NVT V1,1↔PVT V2,1↔PUSH P,V2↔PUSH P,V1 ;SAVE OLDE VERTICES.
TEST V1,PZZ↔GO[CALL(INVERT,E)↔GO .+1] ;FORCE NVT(E) INTO PZZ.
SETQ(U2,{ESPLIT,E})
;COMPUTE LOCUS WHERE E INTERSECTS THE SLICE PLANE.
POP P,V1↔POP P,V2 ;RESTORE OLDE VERTICES.
LAC DX,XWC(V2)↔FSBR DX,XWC(V1)
LAC DY,YWC(V2)↔FSBR DY,YWC(V1)
LAC DZ,ZWC(V2)↔FSBR DZ,ZWC(V1)
LAC ZCUT↔FSBR ZWC(V1)↔FDVR DZ ;COEFFICIENT K.
FMPR DX,0↔FADR DX,XWC(V1)↔DAC DX,XWC(1)
FMPR DY,0↔FADR DY,YWC(V1)↔DAC DY,YWC(1)
FMPR DZ,0↔FADR DZ,ZWC(V1)↔DAC DZ,ZWC(1)
;SPLIT FACE.
AOSG FLAG↔GO[LAC U2↔DAC U0↔GO L2] ;1ST TIME ONLY.
CALL(MKFE,U2,F,U1)
;ADVANCE INTO THE NEXT FACE & FIND NEXT CROSSING EDGE.
L2: LAC U2↔DAC U1
SETQ(F,{OTHER,E,F})
CAMN 1,F0↔GO[CALL(MKFE,U0,F,U1)↔POP2J] ;EXIT
L3: SETQ(E,{ECCW,E,F})
TEST 1,NZZ↔GO L3↔GO L1
DECLARE{F,E,U0,U1,U2,F0,FLAG}
ENDR SLICE;1/11/74(BGB)----------------------------------------------
END